home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / pl2pm < prev    next >
Text File  |  2009-10-01  |  5KB  |  379 lines

  1. #!/usr/bin/perl
  2.     eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
  3.     if $running_under_some_shell;
  4.  
  5. =head1 NAME
  6.  
  7. pl2pm - Rough tool to translate Perl4 .pl files to Perl5 .pm modules.
  8.  
  9. =head1 SYNOPSIS
  10.  
  11. B<pl2pm> F<files>
  12.  
  13. =head1 DESCRIPTION
  14.  
  15. B<pl2pm> is a tool to aid in the conversion of Perl4-style .pl
  16. library files to Perl5-style library modules.  Usually, your old .pl
  17. file will still work fine and you should only use this tool if you
  18. plan to update your library to use some of the newer Perl 5 features,
  19. such as AutoLoading.
  20.  
  21. =head1 LIMITATIONS
  22.  
  23. It's just a first step, but it's usually a good first step.
  24.  
  25. =head1 AUTHOR
  26.  
  27. Larry Wall <larry@wall.org>
  28.  
  29. =cut
  30.  
  31. use strict;
  32. use warnings;
  33.  
  34. my %keyword = ();
  35.  
  36. while (<DATA>) {
  37.     chomp;
  38.     $keyword{$_} = 1;
  39. }
  40.  
  41. local $/;
  42.  
  43. while (<>) {
  44.     my $newname = $ARGV;
  45.     $newname =~ s/\.pl$/.pm/ || next;
  46.     $newname =~ s#(.*/)?(\w+)#$1\u$2#;
  47.     if (-f $newname) {
  48.     warn "Won't overwrite existing $newname\n";
  49.     next;
  50.     }
  51.     my $oldpack = $2;
  52.     my $newpack = "\u$2";
  53.     my @export = ();
  54.  
  55.     s/\bstd(in|out|err)\b/\U$&/g;
  56.     s/(sub\s+)(\w+)(\s*\{[ \t]*\n)\s*package\s+$oldpack\s*;[ \t]*\n+/${1}main'$2$3/ig;
  57.     if (/sub\s+\w+'/) {
  58.     @export = m/sub\s+\w+'(\w+)/g;
  59.     s/(sub\s+)main'(\w+)/$1$2/g;
  60.     }
  61.     else {
  62.     @export = m/sub\s+([A-Za-z]\w*)/g;
  63.     }
  64.     my @export_ok = grep($keyword{$_}, @export);
  65.     @export = grep(!$keyword{$_}, @export);
  66.  
  67.     my %export = ();
  68.     @export{@export} = (1) x @export;
  69.  
  70.     s/(^\s*);#/$1#/g;
  71.     s/(#.*)require ['"]$oldpack\.pl['"]/$1use $newpack/;
  72.     s/(package\s*)($oldpack)\s*;[ \t]*\n+//ig;
  73.     s/([\$\@%&*])'(\w+)/&xlate($1,"",$2,$newpack,$oldpack,\%export)/eg;
  74.     s/([\$\@%&*]?)(\w+)'(\w+)/&xlate($1,$2,$3,$newpack,$oldpack,\%export)/eg;
  75.     if (!/\$\[\s*\)?\s*=\s*[^0\s]/) {
  76.     s/^\s*(local\s*\()?\s*\$\[\s*\)?\s*=\s*0\s*;[ \t]*\n//g;
  77.     s/\$\[\s*\+\s*//g;
  78.     s/\s*\+\s*\$\[//g;
  79.     s/\$\[/0/g;
  80.     }
  81.     s/open\s+(\w+)/open($1)/g;
  82.  
  83.     my $export_ok = '';
  84.     my $carp      ='';
  85.  
  86.  
  87.     if (s/\bdie\b/croak/g) {
  88.     $carp = "use Carp;\n";
  89.     s/croak "([^"]*)\\n"/croak "$1"/g;
  90.     }
  91.  
  92.     if (@export_ok) {
  93.     $export_ok = "\@EXPORT_OK = qw(@export_ok);\n";
  94.     }
  95.  
  96.     if ( open(PM, ">$newname") ) {
  97.         print PM <<"END";
  98. package $newpack;
  99. use 5.006;
  100. require Exporter;
  101. $carp
  102. \@ISA = qw(Exporter);
  103. \@EXPORT = qw(@export);
  104. $export_ok
  105. $_
  106. END
  107.     }
  108.     else {
  109.       warn "Can't create $newname: $!\n";
  110.     }
  111. }
  112.  
  113. sub xlate {
  114.     my ($prefix, $pack, $ident,$newpack,$oldpack,$export) = @_;
  115.  
  116.     my $xlated ;
  117.     if ($prefix eq '' && $ident =~ /^(t|s|m|d|ing|ll|ed|ve|re)$/) {
  118.     $xlated = "${pack}'$ident";
  119.     }
  120.     elsif ($pack eq '' || $pack eq 'main') {
  121.     if ($export->{$ident}) {
  122.         $xlated = "$prefix$ident";
  123.     }
  124.     else {
  125.         $xlated = "$prefix${pack}::$ident";
  126.     }
  127.     }
  128.     elsif ($pack eq $oldpack) {
  129.     $xlated = "$prefix${newpack}::$ident";
  130.     }
  131.     else {
  132.     $xlated = "$prefix${pack}::$ident";
  133.     }
  134.  
  135.     return $xlated;
  136. }
  137. __END__
  138. AUTOLOAD
  139. BEGIN
  140. CHECK
  141. CORE
  142. DESTROY
  143. END
  144. INIT
  145. UNITCHECK
  146. abs
  147. accept
  148. alarm
  149. and
  150. atan2
  151. bind
  152. binmode
  153. bless
  154. caller
  155. chdir
  156. chmod
  157. chomp
  158. chop
  159. chown
  160. chr
  161. chroot
  162. close
  163. closedir
  164. cmp
  165. connect
  166. continue
  167. cos
  168. crypt
  169. dbmclose
  170. dbmopen
  171. defined
  172. delete
  173. die
  174. do
  175. dump
  176. each
  177. else
  178. elsif
  179. endgrent
  180. endhostent
  181. endnetent
  182. endprotoent
  183. endpwent
  184. endservent
  185. eof
  186. eq
  187. eval
  188. exec
  189. exists
  190. exit
  191. exp
  192. fcntl
  193. fileno
  194. flock
  195. for
  196. foreach
  197. fork
  198. format
  199. formline
  200. ge
  201. getc
  202. getgrent
  203. getgrgid
  204. getgrnam
  205. gethostbyaddr
  206. gethostbyname
  207. gethostent
  208. getlogin
  209. getnetbyaddr
  210. getnetbyname
  211. getnetent
  212. getpeername
  213. getpgrp
  214. getppid
  215. getpriority
  216. getprotobyname
  217. getprotobynumber
  218. getprotoent
  219. getpwent
  220. getpwnam
  221. getpwuid
  222. getservbyname
  223. getservbyport
  224. getservent
  225. getsockname
  226. getsockopt
  227. glob
  228. gmtime
  229. goto
  230. grep
  231. gt
  232. hex
  233. if
  234. index
  235. int
  236. ioctl
  237. join
  238. keys
  239. kill
  240. last
  241. lc
  242. lcfirst
  243. le
  244. length
  245. link
  246. listen
  247. local
  248. localtime
  249. lock
  250. log
  251. lstat
  252. lt
  253. m
  254. map
  255. mkdir
  256. msgctl
  257. msgget
  258. msgrcv
  259. msgsnd
  260. my
  261. ne
  262. next
  263. no
  264. not
  265. oct
  266. open
  267. opendir
  268. or
  269. ord
  270. our
  271. pack
  272. package
  273. pipe
  274. pop
  275. pos
  276. print
  277. printf
  278. prototype
  279. push
  280. q
  281. qq
  282. qr
  283. quotemeta
  284. qw
  285. qx
  286. rand
  287. read
  288. readdir
  289. readline
  290. readlink
  291. readpipe
  292. recv
  293. redo
  294. ref
  295. rename
  296. require
  297. reset
  298. return
  299. reverse
  300. rewinddir
  301. rindex
  302. rmdir
  303. s
  304. scalar
  305. seek
  306. seekdir
  307. select
  308. semctl
  309. semget
  310. semop
  311. send
  312. setgrent
  313. sethostent
  314. setnetent
  315. setpgrp
  316. setpriority
  317. setprotoent
  318. setpwent
  319. setservent
  320. setsockopt
  321. shift
  322. shmctl
  323. shmget
  324. shmread
  325. shmwrite
  326. shutdown
  327. sin
  328. sleep
  329. socket
  330. socketpair
  331. sort
  332. splice
  333. split
  334. sprintf
  335. sqrt
  336. srand
  337. stat
  338. study
  339. sub
  340. substr
  341. symlink
  342. syscall
  343. sysopen
  344. sysread
  345. sysseek
  346. system
  347. syswrite
  348. tell
  349. telldir
  350. tie
  351. tied
  352. time
  353. times
  354. tr
  355. truncate
  356. uc
  357. ucfirst
  358. umask
  359. undef
  360. unless
  361. unlink
  362. unpack
  363. unshift
  364. untie
  365. until
  366. use
  367. utime
  368. values
  369. vec
  370. wait
  371. waitpid
  372. wantarray
  373. warn
  374. while
  375. write
  376. x
  377. xor
  378. y
  379.